package com.shujia.day09;

/*
    匿名内部类：
        new 接口名/抽象类名(){
            //重写接口或者抽象类中的方法
        }

    就意味着JVM在运行过程中做了几件事：
        1、JVM内部自己创建一个类
        2、这个类实现一个接口或者继承了一个抽象类
        3、将这个类的对象创建出来


 */
interface Inter1{
    void fun1();
}

//class Inter1Impl1 implements Inter1{
//    @Override
//    public void fun1() {
//        System.out.println("李刚今天下午没有睡觉...");
//    }
//}
//
//class Inter1Impl2 implements Inter1{
//    @Override
//    public void fun1() {
//        System.out.println("江川今天下午睡觉了...");
//    }
//}

class Demo1{
    //当你看到一个接口作为方法参数类型的时候，将来调用时需要传入实现该接口的具体类对象
    public void show1(Inter1 inter1){ //Inter1 inter1 = new Inter1Impl1()
        inter1.fun1();
    }
}

public class NiMingClassDemo1 {
    public static void main(String[] args) {
        Demo1 demo1 = new Demo1();
//        demo1.show1(new Inter1Impl1());
//
//        demo1.show1(new Inter1Impl2());

        demo1.show1(new Inter1() {
            @Override
            public void fun1() {
                System.out.println("李刚今天下午没有睡觉...");
            }
        });

        demo1.show1(new Inter1() {
            @Override
            public void fun1() {
                System.out.println("江川今天下午睡觉了...");
            }
        });

        //扩展知识，今天不细说，最后一天的时候细说
//        demo1.show1(new Inter1() {
//            @Override
//            public void fun1() {
//                System.out.println("数加666");
//            }
//        });
        //若匿名内部类是一个接口的对象，且接口中只有一个抽象方法，就可以改写以下写法格式
//        demo1.show1(()->System.out.println("数加666")); // lambda表达式




    }
}
